﻿//#include <iostream>
//using namespace std;
//class A
//{
//public:
//	A()
//	{
//		cout << "A()" << endl;
//		_p1 = new int;
//		throw "Division by zero condition!";
//		//_p2的动态开辟未被调用，即构造函数没有完全被调用，系统不会调用析构函数
//		_p2 = new int;
//	}
//	~A()
//	{
//		cout << "~A()" << endl;
//		delete _p1;
//		delete _p2;
//	}
//private:
//	int* _p1;
//	int* _p2;
//};
//int main()
//{
//	//A aa; 不能在此出调用，因为throw抛异常后无catch处理，程序直接终止
//	try {
//		A a;
//	}
//	catch (const char* _error) {
//		cout << "error = " << _error << endl;
//	}
//	return 0;
//}

//class A
//{
//public:
//	A()
//	{
//		cout << "A()" << endl;
//		_p1 = new int;
//		_p2 = new int;
//	}
//	~A()
//	{
//		cout << "~A()" << endl;
//		delete _p1;
//		throw "Division by zero condition!";
//		delete _p2;
//	}
//private:
//	int* _p1;
//	int* _p2;
//};
//int main()
//{
//	try {
//		A a;
//		a.~A();
//	}
//	catch (const char* _error) {
//		cout << "error = " << _error << endl;
//	}
//	return 0;
//}

//double Division(int a, int b)
//{
//	if (b == 0)
//	{
//		throw "Division by zero condition!";
//	}
//	return (double)a / (double)b;
//}
//void Func()
//{
//	int* array = new int[10];
//	try {
//		int len, time;
//		cin >> len >> time;
//		cout << Division(len, time) << endl;
//		//若这里还有间接层，如func1的try调用func2,func2的try调用func3.....
//		/*我们不可能列出所有可能异常类型的情况，
//      下面catch若是捕获不到异常，将跳转到上一个作用域，此作用域下面的代码将不会被执行*/
//	}
//	catch (int errmsg)
//	{
//		cout << errmsg << endl;
//	}
//	catch (...) //万能捕获可以解决此问题
//	{
//		// 这里的捕获异常不是为了处理异常
//		// 是为了释放内存，然后异常在重新抛出
//		cout << "delete []" << array << endl;
//		delete[] array;
//		throw; //表示补到什么异常就抛什么异常
//	}
//	// ...假设这里还有一些重要功能的代码，
//  // 若是fun1的异常类型是string,这里的catch一旦捕获不到，导致这里的重要代码不能被执行
//	cout << "delete []" << array << endl;
//	delete[] array;
//}
//int main()
//{
//	try
//	{
//		Func();
//	}
//	catch (const char* errmsg)
//	{
//		cout << errmsg << endl;
//	}
//	return 0;
//}

//void fun() throw(int, double, string, const char*, int*)
//{
//	double a = 1.2;
//	double* p = &a;
//	throw  p; //抛double*类型异常
//}
//int main()
//{
//	try {
//		fun();
//	}
//	catch (...)
//	{
//		cout << "未知异常" << endl;
//	}
//	return 0;
//}

//double Division(int a, int b) noexcept
//{
//	if (b == 0)
//	{
//		throw "Division by zero condition!"; //违反C++11
//	}
//	cout << "正常运行" << endl;
//	return (double)a / (double)b;
//}
//int main()
//{
//	try {
//		int a = 0, b = 0;
//		cin >> a >> b;
//		cout << Division(a, b) << endl;
//	}
//	catch (const char* str) {
//		cout << "未知异常" << endl;
//	}
//	return 0;
//}